import  binascii ,re 

file_name = ""
文件目录 = ""
文件头 = {
    "FFD8FFE0": "JPG","89504E47": "PNG","47494638": "GIF","38425053": "PSD(Adobe Photoshop)",
    "00000100": "ICO","504B0304": "ZIP","52617221": "RAR","49492A00": "TIFF","7B5C7274": "rtf",
    "3C3F786D": "XML","68746D6C": "HTML","44656C69": "eml","7FFE340A": "doc","D0CF11E0": "xls.or.doc",
    "25504446": "PDF","50407373": "TXT","2142444E": "Outlook (pst)","57415645": "WAV","41564920": "AVI",
    "4D546864": "MIDI","3026B275": "ASF(Windows Media)","4D5A9000": "exe",}
file_data = ""  # 识别到的文件内容
file_type = ""  # 识别到的文件类型
str1=''
str2=''

# 设置关键词列表,并将关键词发送至flag_list
def 设置正则(self):
    global 正则参数
    正则参数 = self.ui.re_ipnut.text().split(",")
    for i in range(len(正则参数)):
        self.ui.print_echo.append("已更换正则表达式为：" + 正则参数[i])
    return 正则参数

# 识别文件头,将文件数据发送给 file_data 变量,等待后续调用
def 文件读取(self):
    global file_data
    if file_name == '':
        if self.ui.input_echo.toPlainText() != "":
            file_data = self.ui.input_echo.toPlainText()
            return file_data.encode('utf-8') 
        else: self.ui.print_echo.append('文件和输入都为空,你打算解个p吃?')
    elif file_name != '':
        try:
            with open(file_name, "rb" ) as f:
                file_data = f.read()  # 读取文件数据 布尔类型
            return file_data   
        except:
            self.ui.print_echo.append("未能读取文件,请检查输入目录")
    else: self.ui.print_echo.append('请输入内容，或拖拽文件到窗口')


def 二进制打开(self):
    file_data = 文件读取(self)
    self.ui.print_echo.append(f"已输入文件类型为 : {file_data} 文件")

def 识别文件(self):
    self.ui.print_echo.append(f"输入文件类型为 : {file_name.split('.')[-1]} 文件")
    global file_type
    file_data = 文件读取(self)
    data_hard = binascii.hexlify(file_data)[0:8].decode()  # 转换为十六进制数据 并剪切前8位
    self.ui.print_echo.append("文件头为：" + data_hard)
    if data_hard.upper() in 文件头.keys():
        file_type = 文件头[data_hard.upper()]
        self.ui.print_echo.append("自动识别的文件类型为：" + str(file_type))
        return file_data, file_type
    else:
        self.ui.print_echo.append("未识别的文件类型")
    try:
        if re.findall(r'=$',file_data.decode(),re.I) :
            self.ui.print_echo.append("文件中包含 '=' 字符,可能是base64编码")
        if re.findall(r'\u200b|\u200C|\u200d|\u200e|\u202a\u202c|\u202d|\u2022|\u2023|\ufeff',file_data.decode(),re.I) :  
            零宽字符 =  re.findall(r'\u200b|\u200C|\u200d|\u200e|\u202a|\u202c|\u202d|\u2022|\u2023|\ufeff',file_data.decode(),re.I)
            self.ui.print_echo.append(f"文件中包含 '{list({}.fromkeys(零宽字符).keys())}' 等字符,可能是零宽隐写")
            self.ui.print_echo.append('请注意,解码时可能需要不勾选200b')
    except:pass
    # 分离检测
    #输出 = subprocess.check_output(f"python -m binwalk {file_name}")
    #for i in 输出.decode().split('\r\n'): self.ui.print_echo.append(i)

def 设置变量1(self):
    global str1
    try:
        str1 = self.ui.set_str1.text()
        self.ui.print_echo.append("变量1已设置为:"+ str1)
    except Exception as e:
        self.ui.print_echo.append("变量1设置错误" + str(e))

def 设置变量2(self):
    global str2
    try:
        str2 = self.ui.set_str2.text()
        self.ui.print_echo.append("变量2已设置为:"+ str2)
    except Exception as e:
        self.ui.print_echo.append("变量2设置错误"+ str(e))    

def 帮助(self):
    with open("./README.md",'r',encoding='utf-8', errors='ignore') as f:
        说明=f.read()
    self.ui.print_echo.setMarkdown(说明)

def 清理目录(self):
    global file_name,文件目录
    file_name = ''
    文件目录 = ''
    self.ui.input_echo.clear()

